package logic

import (
	"context"
	"errors"
	"golang.org/x/crypto/bcrypt"
	"img_analyse/user/model"
	"img_analyse/user/rpc/internal/svc"
	"img_analyse/user/rpc/types/user"
	"strings"

	"github.com/zeromicro/go-zero/core/logx"
)

type UserResetPasswordLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
}

func NewResetPasswordLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserResetPasswordLogic {
	return &UserResetPasswordLogic{
		ctx:    ctx,
		svcCtx: svcCtx,
		Logger: logx.WithContext(ctx),
	}
}

func (l *UserResetPasswordLogic) ResetPassword(in *user.ResetPasswordRequest) (*user.ResetPasswordResponse, error) {
	// 1. 参数校验
	if len(strings.TrimSpace(in.Username)) < 4 {
		return &user.ResetPasswordResponse{
			Msg: "用户名长度不能小于4位",
		}, errors.New("用户名长度不能小于4位")
	}

	if len(in.Newpassword1) < 6 {
		return &user.ResetPasswordResponse{
			Msg: "新密码长度不能小于6位",
		}, errors.New("新密码长度不能小于6位")
	}

	if in.Newpassword2 != in.Newpassword1 {
		return &user.ResetPasswordResponse{
			Msg: "两次输入的新密码不一致",
		}, errors.New("两次输入的新密码不一致")
	}

	// 2. 查找用户是否存在
	var userInfo model.User
	err := l.svcCtx.DB.Where("username = ?", in.Username).First(&userInfo).Error
	if err != nil {
		l.Logger.Error("用户不存在", logx.Field("err", err))
		return &user.ResetPasswordResponse{
			Msg: "用户不存在",
		}, errors.New("用户不存在")
	}

	userInfo.Password = in.Newpassword1
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(userInfo.Password), bcrypt.DefaultCost)
	if err != nil {
		l.Logger.Error("密码加密失败", logx.Field("err", err))
		return &user.ResetPasswordResponse{
			Msg: "密码加密失败",
		}, errors.New("密码加密失败")
	}
	userInfo.Password = string(hashedPassword)
	err = l.svcCtx.DB.Model(&userInfo).Update("password", userInfo.Password).Error
	if err != nil {
		l.Logger.Error("重置密码失败", logx.Field("err", err))
		return &user.ResetPasswordResponse{
			Msg: "重置密码失败",
		}, errors.New("重置密码失败")
	}
	return &user.ResetPasswordResponse{
		UserId:   uint32(userInfo.ID),
		Username: userInfo.Username,
		Msg:      "重置密码成功",
	}, nil
}
